//
////#include<iostream>
////#include<list>
////using namespace std;
////
////template<class T1, class T2>
////
////class Data
////
////{
////
////public:
////
////	Data() { cout << "Data<T1, T2>" << endl; }
////
////private:
////
////	T1 _d1;
////
////	T2 _d2;
////
////};
////
////template <class T1>
////
////class Data<T1, int>
////
////{
////
////public:
////
////	Data() { cout << "Data<T1, int>" << endl; }
////
////private:
////
////	T1 _d1;
////
////	int _d2;
////
////};
////
////template <typename T1, typename T2>
////
////class Data <T1*, T2*>
////
////{
////
////public:
////
////	Data() { cout << "Data<T1*, T2*>" << endl; }
////
////private:
////
////	T1 _d1;
////
////	T2 _d2;
////
////};
////
////template <typename T1, typename T2>
////
////class Data <T1&, T2&>
////
////{
////
////public:
////
////	Data(const T1& d1, const T2& d2)
////
////		: _d1(d1)
////
////		, _d2(d2)
////
////	{
////
////		cout << "Data<T1&, T2&>" << endl;
////
////	}
////
////private:
////
////	const T1& _d1;
////
////	const T2& _d2;
////
////};
////
////int main()
////{
////	Data<double, int> d1;//Data<T1, int>
////	Data<int, double> d2;//Data<T1, T2>
////	Data<int*, int*> d3;//Data<T1*, T2*>
////	Data<int&, int&> d4(1, 2);//Data<T1&, T2&>
////	return 0;
////}
//
//
//int main()
//{
//	int ar[] = { 0,1, 2, 3, 4,  5, 6, 7, 8, 9 };
//	int n = sizeof(ar) / sizeof(int);
//
//	list<int> mylist(ar, ar + n);
//	
//	list<int>::iterator pos = find(mylist.begin(), mylist.end(), 5);
//
//	reverse(mylist.begin(), pos);
//
//	reverse(pos, mylist.end());
//
//	list<int>::const_reverse_iterator crit = mylist.crbegin();
//
//	while (crit != mylist.crend())
//
//	{
//
//		cout << *crit << " ";
//
//		++crit;
//
//	}
//
//	cout << endl;
//
//}